CSS: Add support to wake up the core from wfi in GICv3
authorDavid Wang <[email protected]>
Tue, 7 Jun 2016 01:22:40 +0000 (09:22 +0800)
committerDavid Wang <[email protected]>
Wed, 8 Jun 2016 09:20:20 +0000 (17:20 +0800)
In GICv3 mode, the non secure group1 interrupts are signalled via the
FIQ line in EL3. To support waking up from CPU_SUSPEND to standby on
these systems, EL3 should route FIQ to EL3 temporarily before wfi and
restore the original setting after resume. This patch makes this change
for the CSS platforms in the `css_cpu_standby` psci pm ops hook.

Change-Id: Ibf3295d16e2f08da490847c1457bc839e1bac144

plat/arm/css/common/css_pm.c

index b6f94ac259b72c0e566300f40acae16ce2de4320..801d937578567e2823a42f583cb96da6e99eb1fb 100644 (file)
@@ -262,8 +262,14 @@ void css_cpu_standby(plat_local_state_t cpu_state)
        assert(cpu_state == ARM_LOCAL_STATE_RET);
 
        scr = read_scr_el3();
-       /* Enable PhysicalIRQ bit for NS world to wake the CPU */
-       write_scr_el3(scr | SCR_IRQ_BIT);
+       /*
+        * Enable the Non secure interrupt to wake the CPU.
+        * In GICv3 affinity routing mode, the non secure group1 interrupts use
+        * the PhysicalFIQ at EL3 whereas in GICv2, it uses the PhysicalIRQ.
+        * Enabling both the bits works for both GICv2 mode and GICv3 affinity
+        * routing mode.
+        */
+       write_scr_el3(scr | SCR_IRQ_BIT | SCR_FIQ_BIT);
        isb();
        dsb();
        wfi();